#!/usr/bin/python3.8.9
# -*- coding: utf-8 -*-
# @Author  : Tina Yu
# @Time    : 2021-11-28 14:15
import json
from time import sleep

from selenium import webdriver

from utils.get_current_time import get_current_time
from utils.my_logger import log

"""
1、初始化driver
2、封装基本的操作。例如：find、finds等
"""


class BasePage:
    _base_url = None

    def __init__(self, base_driver=None):
        """
        由于子类无构造函数则调用父类的，会导致driver重复实例化（重复打开窗口）
        解决方案： 如果base_driver 为真，为真就是不等于None，那么就不需要重复实例化的操作
        """
        if base_driver:
            self.driver = base_driver
            from utils.my_logger import log
            log.debug("base_drver不为空，不需要重复实例化！")
        else:
            # 实例化driver。为了子类能够使用，加了self
            self.driver = webdriver.Chrome()

            # 加隐式等待
            self.driver.implicitly_wait(3)

        # 1、 如果base_url不为None，则打开页面，这样就可以在不同的page页面传不同的url，从而达到不同page对应不同url的目的。
        # 2、但是每次打开都要进行扫码登录，解决方案：通过读取已经存在的cookie来解决。（前提是已经获取到）
        # not a:判断a是否为空；a is not None:判断a是否声明并定义了
        if self._base_url is not None:
            self.driver.get(self._base_url)
            # 获取cookie
            # todo 改为相对路径
            cookie = json.load(open("D:/python_workspace/autotest/homework/task_selenium/test_datas/cookie.json", "r"))
            # 植入cookie
            for c in cookie:
                self.driver.add_cookie(c)
            sleep(3)
            # 4.再次访问企业微信页面，发现无需扫码自动登录，而且可以多次使用
            self.driver.get(self._base_url)
            sleep(3)
        else:
            # 如果url 为空，那么抛出异常
            print("base_url为空")
            # todo 如何处理url为空的异常

    def find(self, by, locator=None):
        """
        查找单个元素
        :param by: 定位器 by=By.ID
        :param locator:value=None
        :return:WebElement
        """
        log.info(f'查找元素：{locator}')
        try:
            # 如果传入一个参数，证明是元祖
            if locator is None:
                # 如果传入元祖，则做解包操作
                res = self.driver.find_element(*by)
            # 如果传入两个参数，证明是分开传递的
            else:
                res = self.driver.find_element(by, locator)
        except Exception:
            log.error(f"查找元素失败{by}")
            # 截图并保存到test_datas中
            current_time = get_current_time('%Y%m%d-%H%M%S')
            self.driver.save_screenshot(f"../test_datas/element_fail{current_time}.png")
            raise
        else:
            log.debug(f"{by}查找元素成功")
        return res

    def finds(self, by, locator=None):
        """
        查找元素合集
        :param by:定位器 by=By.ID
        :param locator:定位器 value=None
        :return: 元素对象合集
        :rtype List of WebElement
        """
        log.info(f'查找元素：{locator}')
        try:
            # 如果传入一个参数，证明是元祖
            if locator is None:
                # 如果传入元祖，则做解包操作
                res = self.driver.find_elements(*by)
            # 如果传入两个参数，证明是分开传递的
            else:
                res = self.driver.find_elements(by, locator)
        except Exception:
            log.error(f"查找元素失败{by}")
            # 截图并保存到test_datas中
            current_time = get_current_time('%Y%m%d-%H%M%S')
            self.driver.save_screenshot(f"../test_datas/element_fail{current_time}.png")
            raise
        else:
            log.debug(f"{by}查找元素成功")
        return res
